home *** CD-ROM | disk | FTP | other *** search
/ Maclife 42 / MACLIFE42.ISO.7z / MACLIFE42.ISO / FreeWare200 / 圧縮伸張⁄コード / MacGzip / MacGzip 1.1.2 Source.sea / MacGzip 1.1.2 Source / Mac / MacBinary.c < prev    next >
Text File  |  1997-04-01  |  7KB  |  222 lines

  1. /*
  2.  * MacBinary II+ stuff
  3.  * From Peter N. Lewis (MacBinary II+ 1.0.0 crc.a)
  4.  */
  5.  
  6. #include "Macbinary.h"
  7. #define    PStrCpy(a,b)        BlockMove((b), (a), *(b) + 1 )
  8.  
  9. static short CalcMBCRC( unsigned long count, char *buffer);
  10.  
  11.  
  12. OSErr SetCatInfoFromMBHeader( FSSpec *myFSSpec, MBIIStartHeader *start, MBIIHeader *header)
  13. {
  14. #pragma unused(header)
  15.  
  16.     OSErr                error = noErr;
  17.     CInfoPBRec            myParamBlock;
  18.     
  19.     myParamBlock.hFileInfo.ioNamePtr                = myFSSpec->name;
  20.     myParamBlock.hFileInfo.ioVRefNum                 = myFSSpec->vRefNum;
  21.     myParamBlock.hFileInfo.ioFDirIndex                = 0;
  22.     myParamBlock.hFileInfo.ioDirID                    = myFSSpec->parID;
  23.     
  24.     if ( noErr == (error = PBGetCatInfoSync( (CInfoPBPtr) &myParamBlock )))
  25.     {
  26.         myParamBlock.hFileInfo.ioNamePtr                = myFSSpec->name;
  27.         myParamBlock.hFileInfo.ioVRefNum                 = myFSSpec->vRefNum;
  28.         myParamBlock.hFileInfo.ioFDirIndex                = 0;
  29.         myParamBlock.hFileInfo.ioDirID                    = myFSSpec->parID;
  30.         myParamBlock.hFileInfo.ioFlFndrInfo.fdType        = start->ftype;
  31.         myParamBlock.hFileInfo.ioFlFndrInfo.fdCreator    = start->fcreator;
  32.         myParamBlock.hFileInfo.ioFlFndrInfo.fdFlags     =
  33.                 ((start->flags_high << 8) & 0xFF00) | (start->flags_low & 0x00FF);
  34.                 
  35.         myParamBlock.hFileInfo.ioFlFndrInfo.fdFlags        &= !(fInvisible );
  36.         
  37.         myParamBlock.hFileInfo.ioFlFndrInfo.fdLocation    = start->flocation;
  38.         myParamBlock.hFileInfo.ioFlCrDat                = start->create_date;
  39.         myParamBlock.hFileInfo.ioFlMdDat                = start->mod_date;
  40.     
  41.         error = PBSetCatInfoSync(& myParamBlock);
  42.     }
  43.     return error;
  44. }
  45.  
  46. OSErr MBHeaderFromFSSpec( FSSpec *myFSSpec, MBIIStartHeader *start, MBIIHeader *header)
  47. {
  48.     OSErr                error = noErr;
  49.     CInfoPBRec            myParamBlock;
  50.     FInfo                *myFInfo = & (myParamBlock.hFileInfo.ioFlFndrInfo);
  51.     
  52.     myParamBlock.hFileInfo.ioNamePtr =        myFSSpec->name;
  53.     myParamBlock.hFileInfo.ioVRefNum =        myFSSpec->vRefNum;
  54.     myParamBlock.hFileInfo.ioDirID =        myFSSpec->parID;
  55.     myParamBlock.hFileInfo.ioFDirIndex =    0;
  56.  
  57.     if ( noErr == (error = PBGetCatInfoSync( (CInfoPBPtr) &myParamBlock )))
  58.     {
  59.  
  60. /*        memset((char*)start,0x00,sizeof(*start)); *//* just cosmetic */
  61. /*        memset((char*)header,0x00,sizeof(*header)); *//* just cosmetic */
  62.  
  63.         PStrCpy( start->name,  myFSSpec->name);
  64.         start->ftype            = myFInfo->fdType;
  65.         start->fcreator            = myFInfo->fdCreator;
  66.         start->flags_high        = ( myFInfo->fdFlags >> 8 );
  67.         start->flags_low        = myFInfo->fdFlags;
  68.         start->zero1            = 0;
  69.         start->flocation        = myFInfo->fdLocation;
  70.         start->windowID            = myFInfo->fdFldr;
  71.         start->protected        = 0;
  72.         start->zero2            = 0;
  73.         start->dlen                = myParamBlock.hFileInfo.ioFlLgLen;
  74.         start->rlen                = myParamBlock.hFileInfo.ioFlRLgLen;
  75.         start->create_date        = myParamBlock.hFileInfo.ioFlCrDat;
  76.         start->mod_date            = myParamBlock.hFileInfo.ioFlMdDat;
  77.         start->clen                = 0;
  78.         
  79.         header->version                = 0;
  80.         BlockMove( start, &(header->MBIIStart), sizeof(*start));
  81.         header->total_unpack_len    = 0L;
  82.         header->second_header_len    = 0L;
  83.         header->versionII            = 129;
  84.         header->minversionII        = 129;
  85.         header->crc                    = CalcMBCRC( 124, (char *) header);
  86.         header->processorID            = 0;
  87.     }
  88.     return error;    
  89. }
  90.  
  91. /*
  92.  * From MacBinary II Conference 6/21/87:
  93.  * To determine if a header is a valid  MacBinary header, check bytes 0 and 74 to
  94.  * be both zero.  If they are both zero, either (a) the CRC should match, which
  95.  * means it is a MB II file, or (b) byte 82 is zero, which means it may be a MB I
  96.  * file.  (Note that, at the current version level, byte 82 is kept zero to
  97.  * maintain compatibility with MacBinary I. If at some point the MacBinary
  98.  * versions change sufficiently that it is necessary to keep MacBinary I programs
  99.  * from downloading these files, we can change byte 82 to non-zero.)
  100.  *
  101.  *
  102.  * SPDsoft 97. But...
  103.  * What when all the bytes are 0x00 ????
  104.  * The CRC gives 0 too, so this method would return "valid MB II file" !
  105.  *
  106.  * By now I will add only a (*start->name != 0x00) condition
  107.  *
  108.  */
  109.  
  110. short ValidateMBHeader( MBIIStartHeader *start, MBIIHeader *header, Boolean handle2plus )
  111. {
  112.     short packet_type = PT_None;
  113.     
  114.     BlockMove(&(header->MBIIStart), start, sizeof(*start));
  115.     
  116.     if ((header->version <= handle2plus) && (*((char*)header + 74 ) == 0x00 ))
  117.     {
  118.         if (
  119.             (header->crc == CalcMBCRC( 124, (char *) header) ) &&
  120.             (*start->name != 0x00 )
  121.             )
  122.         {
  123.             if (
  124.                     (header->version == 1) &&
  125.                     (start->ftype == macbin_folder_ftype) &&
  126.                     (
  127.                         (start->fcreator == macbin_folder_creator_start) ||
  128.                         (start->fcreator == macbin_folder_creator_end)
  129.                     )
  130.                 )
  131.             {
  132.                 packet_type = (start->fcreator == macbin_folder_creator_start) ? PT_StartBlock : PT_EndBlock;
  133.             }
  134.             else
  135.             {
  136.                 packet_type = PT_File;
  137.             }
  138.         }
  139.         else /* MacBinary I */
  140.         {
  141.             if (
  142.                     (header->version == 0) &&
  143.                     (*((char*)header + 1 ) >= 1 ) &&
  144.                     (*((char*)header + 1 ) <= 31 )
  145.                 )
  146.             {
  147.                     *((char*)header + 101 )        = 0x00 ; /* Zero out the flags low_byte */
  148.                     header->total_unpack_len    = 0;
  149.                     header->second_header_len    = 0;
  150.                     header->versionII            = 129;
  151.                     header->minversionII        = 129;
  152.                     header->crc                    = 0;
  153.                     header->processorID            = 0;
  154.             }
  155.         }
  156.     }
  157.     return packet_type;
  158. }
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166. static short CalcMBCRC( unsigned long count, char *buffer)
  167. {
  168.     register unsigned long    i;
  169.     register short            crc;
  170.     register char            *c;
  171.     
  172.     extern unsigned short    crc_16_tab[];
  173.     
  174.     for( i=0, crc=0, c = buffer; i< count; i++)
  175.     {
  176.         crc =     (( crc & 0x00ff )  << 8)
  177.                 ^
  178.                 crc_16_tab [
  179.                             (( crc & 0xff00 ) >> 8)
  180.                             ^
  181.                             ( (short) c[i] & 0x00ff )
  182.                             ];
  183.     }
  184.     return crc;
  185. }
  186.  
  187.  
  188. unsigned short crc_16_tab[] = {
  189.         0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
  190.         0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
  191.         0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
  192.         0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
  193.         0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
  194.         0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
  195.         0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
  196.         0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
  197.         0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
  198.         0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
  199.         0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
  200.         0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
  201.         0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
  202.         0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
  203.         0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
  204.         0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
  205.         0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
  206.         0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
  207.         0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
  208.         0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
  209.         0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
  210.         0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
  211.         0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
  212.         0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
  213.         0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
  214.         0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
  215.         0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
  216.         0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
  217.         0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
  218.         0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
  219.         0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
  220.         0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
  221.     };
  222.